﻿using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LM.Negocio.Validadores
{
    /// <summary>
    /// Rafael.
    /// Classe que verifica a consistencia em Veiculo.
    /// </summary>
    public class ValidadorDeVeiculo : ValidadorAbastrato
    {
        private Veiculo _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Veiculo> _repositorioDeVeiculo;

        public ValidadorDeVeiculo(IRepositorioDeConsultaDeObjetos<Veiculo> repositorioDeVeiculo)
        {
            if (repositorioDeVeiculo == null)
            {
                throw new ArgumentNullException("repositorioDeVeiculo");
            }

            _repositorioDeVeiculo = repositorioDeVeiculo;
        }

        public void ValideCadastro(Veiculo veiculo)
        {
            if (veiculo == null)
            {
                throw new ArgumentException("veiculo");
            }

            _objetoValidado = veiculo;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideCorNaoInformada();
            ValideAnoNaoInformado();
            ValidePlacaNaoInformada();
            ValideModeloNaoInformado();
            //ValideTipoDoVeiculo();
            
            ValideVeiculoJaCadastrado();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao(Veiculo veiculo)
        {
            if (veiculo == null)
            {
                throw new ArgumentException("veiculo");
            }

            _objetoValidado = veiculo;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideCorNaoInformada();
            ValideAnoNaoInformado();
            ValidePlacaNaoInformada();
            ValideModeloNaoInformado();
            //ValideTipoDoVeiculo();

            ValideVeiculoNaoCadastrado();

            base.GarantaSucesso();
        }

        public void ValideExclusao(Veiculo veiculo)
        {
            if (veiculo == null)
            {
                throw new ArgumentException("veiculo");
            }

            _objetoValidado = veiculo;
            base.LimpeInconsistencias();

            ValideVeiculoNaoCadastrado();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if (_objetoValidado.Codigo == 0)
            {
                AdicioneInconsistencia("Código não informado.");
            }
        }
        
        private void ValideCorNaoInformada()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Cor))
            {
                AdicioneInconsistencia("Cor não informada.");
            }
        }
       
        private void ValideAnoNaoInformado()
        {
            if (_objetoValidado.Ano == 0)
            {
                AdicioneInconsistencia("Ano não Informado.");
            }
        }

        private void ValidePlacaNaoInformada()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Placa))
            {
                AdicioneInconsistencia("Placa não informada.");
            }
        }
        
        private void ValideModeloNaoInformado()
        {
            if (_objetoValidado.Modelo == null)
            {
                AdicioneInconsistencia("Modelo não informado.");
            }
        }

        //private void ValideTipoDoVeiculo()
        //{
        //    if (_objetoValidado.TipoDeVeiculo == null)
        //    {
        //        AdicioneInconsistencia("Tipo do Veiculo não informado.");
        //    }
        //}

        private bool VeiculoJaCadastrado()
        {
            return _repositorioDeVeiculo.Consulte(m => m.Codigo == _objetoValidado.Codigo).Any();
        }
         
        private void ValideVeiculoJaCadastrado()
        {
            if (VeiculoJaCadastrado())
            {
                AdicioneInconsistencia("Já existe uma Veiculo cadastrado com o código {0}.", _objetoValidado.Codigo);
            }
        }

        private void ValideVeiculoNaoCadastrado()
        {
            if (!VeiculoJaCadastrado())
            {
                AdicioneInconsistencia("Veiculo com o código {0} não está cadastrado.", _objetoValidado.Codigo);
            }
        }

    }
}
